package com.hollycrm.hollysqm.job.index.listener;

import java.text.ParseException;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang.time.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.dangdang.ddframe.job.api.JobExecutionMultipleShardingContext;
import com.dangdang.ddframe.job.api.listener.ElasticJobListener;
import com.hollycrm.hollysqm.entities.TblJobIndex;
import com.hollycrm.hollysqm.job.index.dao.IndexJobDao;
import com.hollycrm.hollysqm.util.Constant;

/**
 * i8数据抽取Job监听器
 * @author jianglong
 * @date 2017年2月27日 上午11:47:40
 */
@Service
public class CreateI8IndexListener implements ElasticJobListener {

	private final Logger log = LoggerFactory.getLogger(getClass());	
	
	/**
	 * 获取下载Job时间节点
	 */
	@Autowired
	private IndexJobDao indexJobDao;
	
	private long tagTime=0;
	
	/**
	 * 在job执行前，先执行本方法
	 */
	@Override
	public void beforeJobExecuted(JobExecutionMultipleShardingContext shardingContext) {
		// TODO Auto-generated method stub
		tagTime = System.currentTimeMillis();
		shardingContext.setJobParameter(Constant.EXECUTION +"_"+tagTime);
	}

	/**
	 * 在job执行完毕后，再执行本方法
	 * 识别Job是否执行成功，并记录失败的执行次数；
	 */
	@Override
	public void afterJobExecuted(JobExecutionMultipleShardingContext shardingContext) {		
		//如果等于execution表示有一个JOB还在执行中，则跳出本监听器方法
		String jobParameter = shardingContext.getJobParameter();
		log.debug("jobParam:"+jobParameter);
		if (StringUtils.equals(Constant.EXECUTION+"_"+tagTime, jobParameter)) {
			log.info("正在执行中，退出CreateI8IndexJob...");
			return ;
		}
		List<TblJobIndex> jobList = indexJobDao.getJobIndexList(Constant.CREATE_I8_INDEX_JOB);
		TblJobIndex jobIndex = jobList.get(0);
		String exeTime = jobIndex.getExeTime();//job抽数时间
		int circle = jobIndex.getCircle();//重复执行次数		
		boolean bl = StringUtils.equals(Constant.SUCCESS, jobParameter);//执行成功
		try{
			circle =  circle + 1;
			if (circle > Constant.INDEX_CIRCLE_COUNT){//错误3次后，则跳过本次job的执行
				bl=true;
				log.error("CreateI8IndexJob 执行时间："+exeTime+" 连续"+ circle +"次失败，跳过本次Job时间执行下一个任务！");
			}
			if (bl){
				if (exeTime.length() == 10){
					Date date = DateUtils.addHours(DateUtils.parseDate(exeTime, new String[]{"yyyyMMddHH"}), 1);
					exeTime = DateFormatUtils.format(date, "yyyyMMddHH");
				}else if (exeTime.length() == 12) {
					Date date = DateUtils.addMinutes(DateUtils.parseDate(exeTime, new String[]{"yyyyMMddHHmm"}), 10);
					exeTime = DateFormatUtils.format(date, "yyyyMMddHHmm");
				}
				circle = 0;
			}
			indexJobDao.updateJobIndex(exeTime, circle, Constant.CREATE_I8_INDEX_JOB);
		}catch(ParseException pe){
			log.error("时间解析异常...",pe);
		}catch(Exception e){
			log.error("数据更新异常...",e);
		}finally{
			log.info("执行结束CreateI8IndexJob...");
		}
	} 
}
